package dao;

import hibernateUtils.HibernateUtil;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javaUtils.DateUtil;
import model.Reserva;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import beans.ReservaBean;
import beans.SalonBean;
import controller.AdministradorReserva;
import dto.ReservaDTO;
import dto.SalonDTO;

public class HibernateReservaDAO {

	private static HibernateReservaDAO instancia = null;
	private static SessionFactory sf = null;

	public static HibernateReservaDAO getInstancia() {
		if (instancia == null) {
			sf = HibernateUtil.getSessionFactory();
			instancia = new HibernateReservaDAO();
		}
		return instancia;
	}

	public ReservaDTO grabarReserva(ReservaDTO r, SalonDTO s) {
		/* Convierto el parametro a bean */
		ReservaBean aux = new ReservaBean();
		aux.setCantidad(r.getCantidad());
		aux.setEstado(r.getEstado());
		aux.setIdReserva(r.getidReserva());
		aux.setFechaReserva(r.getFecha());
		aux.setHora(r.getHora());

		/* Abro sesion y grabo el objeto */
		Session session = sf.openSession();
		session.beginTransaction();

		SalonBean sbean;
		sbean = (SalonBean) session.load(SalonBean.class, s.getId());
		sbean.addReservaBean(aux);

		session.saveOrUpdate(sbean);
		session.flush();
		session.getTransaction().commit();
		session.close();
		return AdministradorReserva.getInstancia().fromModelTODTO(
				AdministradorReserva.getInstancia().fromBeanTOModel(aux));
	}

	public List<Reserva> getReservasDelDia(ReservaDTO reserva, SalonDTO salon) {
		Session session = sf.openSession();
		List<Reserva> reservas = new ArrayList<Reserva>();

		// las reservas que sean de tal salon y de tal fecha
		List<ReservaBean> aux = session
				.createQuery(
						"select r from SalonBean s join s.reservas r "
								+ " where s.idSalon=? "
								+ " and r.fechaReserva=? and r.hora=?")
				.setInteger(0, salon.getId()).setDate(1, reserva.getFecha())
				.setInteger(2, reserva.getHora()).list();

		for (ReservaBean rb : aux) {
			Reserva r = new Reserva();
			r.setCantidad(rb.getCantidad());
			r.setEstado(rb.getEstado());
			r.setFechaReserva(rb.getFechaReserva());
			r.setNumero(rb.getIdReserva());
			reservas.add(r);
		}
		session.close();
		return reservas;

	}

	public List<Reserva> getReservasDeAhora() {
		Session session = sf.openSession();
		String f = DateUtil.getInstancia().getDiaActualString();
		Date actual = DateUtil.getInstancia().getFecha(f);

		List<ReservaBean> reservas = session
				.createQuery(
						"select r from ReservaBean r where r.fechaReserva=?"
								+ "	and r.estado=?").setDate(0, actual)
				.setString(1, "pendiente").list();

		return AdministradorReserva.getInstancia().fromBeanTOModel(reservas);
	}

	public ReservaBean getReserva(ReservaDTO r) {
		Session session = sf.openSession();
		ReservaBean rb = (ReservaBean) session.get(ReservaBean.class,
				r.getidReserva());
		session.close();
		return rb;
	}

	public void updateReserva(ReservaBean r) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.update(r);
		session.flush();
		session.getTransaction().commit();
		session.close();

	}

}
